package com.sugon.lambda;

import com.sugon.entity.Student;
import com.sugon.newInterface.Filter;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
 * @author LUOYUAN
 * @create 2018-12-06-23:55
 */
public class lambda {

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("luoy", 31, 100, "c1"));
        list.add(new Student("yangji", 32, 99, "c1"));
        list.add(new Student("fengchao", 25, 100, "c2"));
        list.add(new Student("suxuem", 26, 80, "c2"));
        /**
         * 获得班级等于c1的学生，传统java中参数只能接收对象或者基本类型变量，代码可读性差，筛选逻辑只是test()方法，
         * java不允许把函数作为参数，允许数据参数化，不允许行为参数化，函数是包含在对象里面的传参，由此演变出来了lambda、
         *  实现接口,并创建对象 (匿名内部类的简化写法)  前提是接口中只能有一个抽象方法，编译器才会推断出来，所以不用写方法名
         *  (参数表)->{方法实现}
         *  (参数表)->表达式  等价于  return 表达式;
         *  (参数表)->单句实现  (return 语句不能视为单句实现)
         */
      /*  List<Student> result = filterObject(list, new Filter<Student>() {
            @Override
            public boolean test(Student s) {
                if (s.getClassNum().equals("c1")) return true;
                else return false;
            }
        });*/
         //result.forEach(System.out::println);
        System.out.println("======");
        // 获得年龄小于25岁的过滤器
        Filter<Student> f1 = (Student s) -> {
            return s.getAge() < 30;
        };
        List<Student> students = filterObject(list, f1);

        for (Student student : students) {
            System.out.println(student);
        }
        Filter<Student> f2 = (Student s) -> s.getAge() < 30;
        //编译器自动推断
        Filter<Student> f3 = (q) -> q.getAge() < 30;
        List<Student> students1 = filterObject(list, f3);
        students.forEach(System.out::println);
        filterObject(list, (s)->s.getScore()<60 && s.getClassNum().equals("C1"));
    }


    /**
     * 过滤集合
     * @param list
     * @param filter
     * @param <T>
     * @return
     */
    static <T> List<T> filterObject(List<T> list, Filter<T> filter) {
        List<T> result = new ArrayList<>();
        for (T s : list) {
            if (filter.test(s)) {
                result.add(s);
            }
        }
        return result;
    }
}



